#ifndef __DEBUG_H__
#define __DEBUG_H__




#define CDBG_IDx(n, id) ((1<<(n+4)) | (id<<(n*8+8)))
#define CDBG_INV         (1<<7)
#define CDBG_PEN         (1<<3)
#define CDBG_XEN         (1<<2)
#define CDBG_WEN         (1<<1)
#define CDBG_REN         (1<<0)

void debug_init();
void exception_analyze();

/********************************** DUBUG SFR *****************************************/

u32 get_dev_id(char *name);

/* ---------------------------------------------------------------------------- */
/**
 * @brief Memory权限保护设置
 *
 * @param idx: 保护框索引, 范围: 0 ~ 3, 目前系统默认使用0和3, 用户可用1和2
 * @param begin: Memory开始地址
 * @param end: Memory结束地址
 * @param inv: 0: 保护框内, 1: 保护框外
 * @param format: "Cxwr0rw1rw2rw3rw", CPU:外设0:外设1:外设2:外设3,
 * @param ...: 外设ID号索引, 如: DBG_EQ, 见debug.h
 */
/* ---------------------------------------------------------------------------- */
void mpu_set(int idx, u32 begin, u32 end, u32 inv, const char *format, ...);


/* ---------------------------------------------------------------------------- */
/**
 * @brief 取消指定框的mpu保护
 *
 * @param idx: 保护框索引号
 */
/* ---------------------------------------------------------------------------- */
void mpu_disable_by_index(u8 idx);


/* ---------------------------------------------------------------------------- */
/**
 * @brief :取消所有保护框mpu保护
 */
/* ---------------------------------------------------------------------------- */
void mpu_diasble(void);


/* ---------------------------------------------------------------------------- */
/**
 * @brief flash PC范围设置为Flash外区域, 调用该接口后调用flash里的函数将触发异常
 */
/* ---------------------------------------------------------------------------- */
void flash_pc_limit_disable();

/* ---------------------------------------------------------------------------- */
/**
 * @brief flash PC范围限制恢复为flash代码区域, 调用该接口后可调用flash里的函数
 */
/* ---------------------------------------------------------------------------- */
void flash_pc_limit_enable();

/* ---------------------------------------------------------------------------- */
/**
 * @brief 用户自定义的异常回调函数,可以在异常时通过该函数打印一些信息
 */
/* ---------------------------------------------------------------------------- */
void exception_analyze_user_callback_register(void (*callback)(int unsigned *sp));

#endif


